﻿using DataTier;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;

namespace KlageSystem
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        Org_Klagedata orgKlage = null;
        Data_Klagebrev klageBrev = null;
        RawKlagesagData rawKlagedata = null;
        string connStr = ConnectionManager.GetConnStr();




        protected void Page_Init(object sender, EventArgs e)
        {
            //Console.WriteLine("Kongen er en finke");
        }


        protected void Page_Load(object sender, EventArgs e)
        {

            if (!IsPostBack)
            {
                if (!Request.Params.AllKeys.Contains("s"))
                {
                    Response.Redirect("~/Default.aspx");
                    return;
                }
                var isNew = Request.Params.Get("s") == "2";

                if (!Request.Params.AllKeys.Contains("id"))
                {
                    Response.Redirect("~/Default.aspx");
                    return;
                }
                int id;
                if (!int.TryParse(Request.Params.Get("id"), out id))
                {
                    Response.Redirect("~/Default.aspx");
                    return;
                }
                orgKlage = Org_Klagedata.Load(connStr, id);

                if (isNew)
                {
                    klageBrev = Data_Klagebrev.Insert(connStr, id);
                    orgKlage.Status = KlageStatus.Under_behandling;
                    orgKlage.Save(connStr);
                }
                else
                    klageBrev = Data_Klagebrev.Load(connStr, id);

                rawKlagedata = RawKlagesagData.Load(id, connStr);

                ViewState["orgKlage"] = orgKlage;
                ViewState["klageBrev"] = klageBrev;
                ViewState["rawKlageData"] = rawKlagedata;

                this.Label1.Text = orgKlage.OrgKlagenr + ": " + orgKlage.EjdAdresse + ", " + orgKlage.EjdPostnr + " " + orgKlage.EjdBy;
                var vurderingsMed = klageBrev.GetVurderingsMeddelese(Properties.Settings.Default.VurderingsPath, Server.MapPath("~/vurderingsmeddelser"));
                if (vurderingsMed != string.Empty)
                {
                    hypVurderingsmeddelese.NavigateUrl = "~/vurderingsmeddelser/" + vurderingsMed;
                    hypVurderingsmeddelese.Visible = true;
                }
                updateControls();
            }
            else
            {
                orgKlage = (Org_Klagedata)ViewState["orgKlage"];
                klageBrev = (Data_Klagebrev)ViewState["klageBrev"];
                klageBrev.Billeder = Klage_billede.Load(connStr, klageBrev.KlageNr);
                rawKlagedata = (RawKlagesagData)ViewState["rawKlageData"];
                updatePnlBilleder();
                updatePnlAreal();
            }

            btnDemote.Visible = (Session["user"].ToString() == "Administrator" && orgKlage.Status != KlageStatus.Modtaget);
        }

        private void updateControls()
        {
           // txtFaktor.Attributes.Add("readonly", "readonly");

            lstSkattecenter.DataSource = Enum.GetNames(typeof(Skattecenter));
            lstSkattecenter.DataBind();
            var selectedSkattecenter = Enums.GetSkattecenter(klageBrev.SkattecenterPostnr);
            lstSkattecenter.SelectedValue = Enum.GetName(typeof(Skattecenter), selectedSkattecenter);

            //Ejer_Firma|Co/ejer|Ejd_Post nr|Ejd_By|Titel|Ejer_Kontakt|Kunde_Telefon|Ejer_Email|Potentiale|Sagstype|Bemærkning|

            if (rawKlagedata != null)
            {
                txtRawEjerFirma.Text = rawKlagedata.EjerFirma;
                txtRawCoEjer.Text = rawKlagedata.CoEjer;
                txtRawEjdPostNr.Text = rawKlagedata.EjerPostNr;
                txtRawEjdBy.Text = rawKlagedata.EjerBy;
                txtRawTitel.Text = rawKlagedata.Title;
                txtRawEjerKontakt.Text = rawKlagedata.EjerKontakt;
                txtRawKundeTelefon.Text = rawKlagedata.KundeTelefon;
                linkRawEjerEmail.NavigateUrl = "mailto:" + rawKlagedata.EjerEmail;
                linkRawEjerEmail.Text = rawKlagedata.EjerEmail;
                txtRawPotentiale.Text = rawKlagedata.Potentiale.ToString("N0", CultureInfo.CreateSpecificCulture("da-DK"));
                txtRawSagsType.Text = Enum.GetName(typeof(RawSagsType), rawKlagedata.SagsType);
                txtRawBemærkning.Text = rawKlagedata.Bemærkning;
            }

            txtMatrNr.Text = klageBrev.MatrNr;

            if (klageBrev.SumBeskrivelse != "")
                txtSumBeskrivelse.Text = klageBrev.SumBeskrivelse;

            updatePnlBilleder();

            txtLokalplannr.Text = klageBrev.LokalplanNr;
            txtLokalplanformaal.Text = klageBrev.LokalplanFormaal;
            txtUdnyttelsespct.Text = klageBrev.UdnyttelsesProcent;

            chkForurening.Checked = klageBrev.Forurening;

            dropV2.DataSource = Enum.GetNames(typeof(Forureningsniveau));
            dropV2.DataBind();
            dropV2.SelectedValue = Enum.GetName(typeof(Forureningsniveau), Enums.GetForureningsNiveau(klageBrev.V2));

            txtKortlaegningsnr.Text = klageBrev.KortlaegningsNr;
            txtStartforrentning.Text = klageBrev.StartForrentning.Replace(',', '.');
            txtFaktor.Text = klageBrev.Faktor.ToString().Replace(',','.');

            txtSkatAfgift.Text = klageBrev.SkatAfg.ToString().Replace(',', '.');
            txtForsikringM2.Text = klageBrev.ForsikringM2.ToString().Replace(',', '.');
            txtVedligeholdM2.Text = klageBrev.VedlUdgM2.ToString().Replace(',', '.');
            txtAdmUdgPct.Text = klageBrev.AdmUdgPct.ToString();
            txtRenholdM2.Text = klageBrev.RenholdUdgM2.ToString().Replace(',', '.');

            updatePnlAreal();
        }

        private void updatePnlAreal()
        {
            //pnlArealer.Controls.Clear();
            while (tblArealer.Rows.Count > 2)
            {
                tblArealer.Rows.RemoveAt(tblArealer.Rows.Count - 2);
            }
            var arealer = Areal_Data.Load(connStr, klageBrev.KlageNr);
            foreach (var arealItem in arealer)
            {
                var row = new TableRow();
                row.TableSection = TableRowSection.TableBody;
                var cell = new TableCell();
                cell.Text = arealItem.Bbr_nr;
                row.Cells.Add(cell);
                cell = new TableCell();
                cell.Text = arealItem.ArealType;
                row.Cells.Add(cell);
                cell = new TableCell();
                cell.Text = arealItem.Areal.ToString().Replace(',','.');
                row.Cells.Add(cell);
                cell = new TableCell();
                cell.Text = arealItem.ArealPris.ToString().Replace(',', '.');
                row.Cells.Add(cell);
                cell = new TableCell();
                var delArealBut = new LinkButton();
                delArealBut.Text = "Slet areal";
                delArealBut.ToolTip = "Klik her for at slette det pågældende areal";
                delArealBut.CssClass = "deleteButton";
                delArealBut.ID = arealItem.Bbr_nr;
                delArealBut.OnClientClick = "return confirm('Er du sikker?');";
                delArealBut.Click += delArealBut_Click;
                cell.Controls.Add(delArealBut);
                row.Cells.Add(cell);
                tblArealer.Rows.AddAt(tblArealer.Rows.Count - 1, row);
            }

     
        }

        void delArealBut_Click(object sender, EventArgs e)
        {
            var delArealBut = (LinkButton)sender;
            var bbr = delArealBut.ID;
            var arealer = Areal_Data.Load(connStr, klageBrev.KlageNr);
            foreach (var arealItem in arealer)
            {
                if (arealItem.Bbr_nr == bbr)
                    arealItem.Delete(connStr);
            }
            updatePnlAreal();
        }

        private void addBillede(Klage_billede billede)
        {
            var billedeLink = new HyperLink();
            billedeLink.Text = billede.PictureLinkStr.Split('/').Last();
            billedeLink.NavigateUrl = billede.PictureLinkStr;
            billedeLink.Target = "_blank";
            pnlBilleder.Controls.Add(billedeLink);
            var lbl = new Label();
            lbl.Text = "&nbsp;&nbsp;";
            pnlBilleder.Controls.Add(lbl);
            var btnDelPic = new LinkButton();
            btnDelPic.Text = "Slet billede";
            btnDelPic.CssClass = "deleteButton";
            btnDelPic.ToolTip = "Klik her for at slette billedet: " + billedeLink.Text;
            btnDelPic.ID = "picure_" + billede.PictureId;
            btnDelPic.OnClientClick = "return confirm('Er du sikker?');";
            btnDelPic.Click += btnDelPic_Click;
            pnlBilleder.Controls.Add(btnDelPic);
            pnlBilleder.Controls.Add(new HtmlGenericControl("br"));
        }

        void btnDelPic_Click(object sender, EventArgs e)
        {
            var btnDelPic = (LinkButton)sender;
            var delId = int.Parse(btnDelPic.ID.Split('_').Last());
            foreach (var billede in klageBrev.Billeder)
            {
                if (billede.PictureId == delId)
                {
                    var path = Server.MapPath("~/") + billede.PictureLinkStr;
                    if (File.Exists(path))
                        File.Delete(path);

                    billede.Delete(connStr);
                }
            }
            klageBrev.Billeder = Klage_billede.Load(connStr, klageBrev.KlageNr);
            updatePnlBilleder();
            //updatePnlAreal();
        }

        protected void btnBack_Click(object sender, EventArgs e)
        {
            Response.Redirect("~/Default.aspx");
        }

        protected void btnSave_Click(object sender, EventArgs e)
        {
            saveKlage();
        }

        private void saveKlage()
        {
            var culture = CultureInfo.CreateSpecificCulture("da-DK");

            var selectedSkattecenter = (Skattecenter)Enum.Parse(typeof(Skattecenter), lstSkattecenter.SelectedValue);
            klageBrev.SkattecenterAdr = Enums.GetAdresse(selectedSkattecenter);
            klageBrev.SkattecenterBy = Enums.GetBy(selectedSkattecenter);
            klageBrev.SkattecenterPostnr = Enums.GetPostnr(selectedSkattecenter);

            klageBrev.MatrNr = txtMatrNr.Text;

            klageBrev.SumBeskrivelse = txtSumBeskrivelse.Text;
            klageBrev.LokalplanNr = txtLokalplannr.Text;
            klageBrev.LokalplanFormaal = txtLokalplanformaal.Text;
            klageBrev.UdnyttelsesProcent = txtUdnyttelsespct.Text;
            klageBrev.Forurening = chkForurening.Checked;
            klageBrev.V2 = dropV2.SelectedValue;
            klageBrev.KortlaegningsNr = txtKortlaegningsnr.Text;
            klageBrev.StartForrentning = txtStartforrentning.Text.Replace('.', ',');
            klageBrev.Faktor = double.Parse(txtFaktor.Text.Replace('.', ','), culture);

            klageBrev.SkatAfg = double.Parse(txtSkatAfgift.Text.Replace('.', ','), culture);
            klageBrev.ForsikringM2 = double.Parse(txtForsikringM2.Text.Replace('.', ','), culture);
            klageBrev.VedlUdgM2 = double.Parse(txtVedligeholdM2.Text.Replace('.', ','), culture);
            klageBrev.AdmUdgPct = int.Parse(txtAdmUdgPct.Text.Replace(".", ""), culture);
            klageBrev.RenholdUdgM2 = double.Parse(txtRenholdM2.Text.Replace('.', ','), culture);

            klageBrev.Save(connStr);
        }

        private void updatePnlBilleder()
        {
            pnlBilleder.Controls.Clear();
            foreach (var bld in klageBrev.Billeder)
            {
                addBillede(bld);
            }
        }

        protected void btnSendMail_Click(object sender, EventArgs e)
        {
            saveKlage();
            OpenNewWindow("mail.aspx?id=" + klageBrev.OrgKlagenr);
        }

        public void OpenNewWindow(string url)
        {
            ClientScript.RegisterStartupScript(this.GetType(), "newWindow", string.Format("<script>var win = window.open('{0}','mailWindow','scrollbars=yes,resizable=yes,toolbar=no,menubar=no,status=no,directories=no,width=1024,height=800'); win.focus();</script>", url)); //, 'width=1024, height=800, menubars=no')
        }

        protected void btnInsert_Click1(object sender, EventArgs e)
        {
            var culture = CultureInfo.CreateSpecificCulture("da-DK");
            var arealer = Areal_Data.Load(connStr, klageBrev.KlageNr);
            foreach (var areal in arealer)
            {
                if (areal.Bbr_nr == txtBBR.Text)
                    txtBBR.Text = areal.Bbr_nr + "_1";
            }
            Areal_Data.Insert(connStr, klageBrev.KlageNr, txtBBR.Text, txtArealType.Text, double.Parse(txtAreal.Text.Replace('.', ','), culture), double.Parse(txtLeje.Text.Replace('.', ','), culture));
            txtBBR.Text = "";
            txtArealType.Text = "";
            txtAreal.Text = "";
            txtLeje.Text = "";
            updatePnlAreal();
        }

        protected void btnDemote_Click(object sender, EventArgs e)
        {
            switch (orgKlage.Status)
            {
                case KlageStatus.Afsendt:
                case KlageStatus.Afsluttet:
                    orgKlage.Status = KlageStatus.Under_behandling;
                    orgKlage.Save(connStr);
                    break;
                case KlageStatus.Under_behandling:
                    orgKlage.Status = KlageStatus.Modtaget;
                    orgKlage.Save(connStr);
                    break;
            }
            Response.Redirect("~/Default.aspx");
        }

        protected void btnDelete_Click(object sender, EventArgs e)
        {
            orgKlage.Status = KlageStatus.Slettet;
            orgKlage.Save(connStr);
            Response.Redirect("~/Default.aspx");
        }

        protected void btnUpload_Click(object sender, EventArgs e)
        {
                if (!fileUploader.HasFile)
                {
                    lblUploader.Text = "Du skal vælge en fil";
                    return;
                }
                if (fileUploader.PostedFile.ContentLength > 3072000)
                {
                    lblUploader.Text = "Filen er for stor. Maksimal størrelse er 3 MB";
                    return;
                }
                if (!CheckValidImageFormat())
                {
                    lblUploader.Text = "Filen skal være et JPEG billede. Prøv igen";
                    return;
                }
                lblUploader.Text = uploadFile();
                klageBrev.Billeder = Klage_billede.Load(connStr, klageBrev.KlageNr);
                updatePnlBilleder();
        }

        private bool CheckValidImageFormat()
        {
            if (fileUploader.PostedFile.ContentType.ToLower() == "image/gif" || fileUploader.PostedFile.ContentType.ToLower() == "image/jpeg" || fileUploader.PostedFile.ContentType.ToLower() == "image/pjpeg" || fileUploader.PostedFile.ContentType.ToLower() == "image/x-png" || fileUploader.PostedFile.ContentType.ToLower() == "image/jpg" || fileUploader.PostedFile.ContentType.ToLower() == "image/bmp")
            {
                return true;
            }
            else
            {
                return false;
            }
        }


        private string uploadFile()
        {
            System.Drawing.Image original_image = null;

            try
            {
                // Get the data
                HttpPostedFile jpeg_image_upload = fileUploader.PostedFile;

                // Retrieve the uploaded image
                original_image = System.Drawing.Image.FromStream(jpeg_image_upload.InputStream);

                var uploadPath = Server.MapPath("~/uploads/") + orgKlage.OrgKlagenr;
                if (!Directory.Exists(uploadPath))
                    Directory.CreateDirectory(uploadPath);
                var fileName = jpeg_image_upload.FileName.Split('\\').Last<string>();
                if (fileName.ToLower() == "image.jpg")
                    fileName = "image_" + (klageBrev.Billeder.Count+1) + ".jpg";


                var filePath = uploadPath + "/" + fileName;
                if (File.Exists(filePath))
                {
                    return "Filen findes allerede";
                }
                else
                {
                    var billede = Klage_billede.Insert(connStr, klageBrev.KlageNr, "uploads/" + orgKlage.OrgKlagenr + "/" + fileName);
                    original_image.Save(filePath);
                    return "";
                }
            }
            catch
            {
                return "En fejl opstod. Prøv igen";
            }
            finally
            {
                // Clean up
                if (original_image != null) original_image.Dispose();
            }
        }
    }
}